
#include <cstdlib>
#include <errno.h>
#include <netdb.h>
#include <string.h>
#include <sys/socket.h>

#include "network/Socket.h"

extern int errno;

Socket::Socket()
    : AbstractIOSocket()
{
}

Socket::~Socket()
{
}

bool Socket::connect(const std::string& host, uint16_t port)
{
    // Fermer la connexion précédente.
    close();

    // Création de la socket
    iSocket_ = socket(AF_INET, SOCK_STREAM,0);
    if(iSocket_ < 0)
    {
        iError_ = errno;
        return false;
    }

    // Récupération de l'hôte par le nom
    struct hostent *hostInfo = gethostbyname(host.c_str());
    if(hostInfo == NULL)
    {
        iError_ = errno;
        return false;
    }

    // Paramétrage de la socket.
    sin_.sin_addr   = *(struct in_addr*)hostInfo->h_addr;
    sin_.sin_family = AF_INET;
    sin_.sin_port   = htons(port);
    length_         = sizeof(sin_);

    // Connexion.
    if(::connect(iSocket_, (struct sockaddr*)&sin_, length_) < 0)
    {
        iError_ = errno;
        return false;
    }

    isOpen_ = true;
    return true;
}
